<?php

/**
 * \file
 * Classe `Link`.
 */

namespace pilar\Links /* \cond */ ; /* \endcond */
{

/**
 * Lien.
 *
 * \since 27/02/2009
 * \author Dirk MARSKI <dirk.marski@gmail.com>
 */
class Link extends \object {


/**
 * Stocke si on a déjà 'découpé' le lien actuel. 
 */
private $_linkTransformed = false;
 

protected function loadDefaultParams() {
 parent::loadDefaultParams();
 $this->params->define(array(
  'name' => '', // Nom (sert en tant qu'identifiant).
  'label' => '', // Libellé.
  'target' => '', // Lien.
  'GETParams' => array(), // Paramètre qui se rajoute en get à la fin du lien.
                          // A donner sous la forme 'nom' => 'valeur'.
  'specificLink' => '' // Permet de spécifier des liens spécifiques. Les options
                       // options disponibles sont :
                       // refererUri (lien pour un retour à la page précédente)
                       // requestUri (lien de la page demandée)
 ));
}


protected function initialize() {
 parent::initialize();

 if ($this->param('specificLink') == '') {
  $this->_linkTransformed = true;
 }
}


public function domNode($domDoc) {
 $domLink = $domDoc->createElement('Link');

 $domLink->setAttribute('name', $this->param('name'));
 $domLink->setAttribute('label', $this->param('label'));
 $target = $this->buildTarget();
 $domLink->setAttribute('target', $target);

 return $domLink;
}


/**
 * On construit le lien final avec les paramètres.
 * S'il y a déjà des paramètres dans l'url, on les garde.
 * 
 * \since 27/02/2009
 */
private function buildTarget() {
 if (!$this->_linkTransformed) {
  $this->transformSpecificLink();
 }
 $target = $this->param('target');
 $params = $this->param('GETParams');
 if (strpos($target, '?') === false) {
  $first = true;
 } else {
  $first = false;
 }

 foreach ($params as $name => $value) {
  if ($first) {
   $first = false;
   $target .= '?';
  } else {
   $target .= '&';
  }
  $target .= $name.'='.$value;
 }

 return $target;
}


/**
 * Fonction qui retourne le lien sous forme de string.
 *
 * \return Lien sous forme de string.
 * \since 29/03/2009
 */
public function getLinkAsString() {
 $target = $this->buildTarget();
 
 return $target;
}


/**
 * Permet d'ajouter des paramètres au lien. Si des paramètres avec des
 * noms identiques existent déjà, il seront remplacés.
 *
 * \param $params Tableau des paramètres sous la forme : $name => $value.
 * \since 05/05/2009
 */
public function addParams($params) {
 if (!$this->_linkTransformed) {
  $this->transformSpecificLink();
 }
 
 $this->params->set(array(
  'GETParams' => array_merge($this->param('GETParams'), $params)
 ));
}


/**
 * Supprimer un paramètre.
 *
 * \param $name Nom du paramètre.
 * \since 05/05/2009
 */
public function deleteParam($name) {
 if (!$this->_linkTransformed) {
  $this->transformSpecificLink();
 }
 
 $params = $this->param('GETParams');

 // Si le paramètre existe, on le supprime :
  if (isset($params[$name])) {
   unset($params[$name]);
   $this->params->set(array(
    'GETParams' => $params
   ));
  }
}


/**
 * Permet de changer la valeur d'un paramètre. Le paramètre est rajouté
 * s'il n'existe pas déjà.
 *
 * \param $name Nom du paramètre.
 * \param $value Nouvelle valeur.
 * \since 05/05/2009
 */
public function setParam($name, $value) {
 if (!$this->_linkTransformed) {
  $this->transformSpecificLink();
 }
 
 $params = $this->param('GETParams');

 $params[$name] = $value;

 $this->params->set(array(
  'GETParams' => $params
 ));
}


/**
 * Transforme le lien specifique en une url de base et des arguments.
 * 
 * \since 22/06/2009
 */
private function transformSpecificLink() {
 if ($this->param('specificLink') == 'requestUri') {
  if (isset($_SERVER['REQUEST_URI'])) {
   $url = $_SERVER['REQUEST_URI'];
  
  // Récupération du lien.
   $target = strstr($url, '?', true); 
   if ($target === false) {
    $target = $_SERVER['REQUEST_URI'];
   }
   
  } else {
   $target = '';
  }
 } else if ($this->param('specificLink') == 'refererUri') {
  if (isset($_SERVER['HTTP_REFERER'])) {
   $url = $_SERVER['HTTP_REFERER'];
  
  // Récupération du lien.
   $target = strstr($url, '?', true); 
   if ($target === false) {
    $target = $_SERVER['HTTP_REFERER'];
   }
   
  } else {
   $target = '';
  }
  
  $this->params->set(array(
   'target' => $target
  ));
 }
 
 if (!empty($_GET)) {
  // Récupération des paramètres :
   $params = array();
   foreach ($_GET as $name => $value) {
    if (strpos($name, '__') === false) {
     // TODO : échapper $value.
     $params[$name] = $value;
    }
   }

  // Enregistrement des paramètres :
   $this->params->set(array(
    'GETParams' => array_merge($this->param('GETParams'), $params)
   ));
  }
}


} // Class.

} // Namespace.
?>
